*--------------------------------------------------------------; * Selects a stratified random sample from a finite population ; * stored in a SAS data set called frame. ; *--------------------------------------------------------------; %macro strs(noprint,frame=,strata=,setup=,npop=,n=,sample=, seed=); %if %length(&seed) = 0 %then %let seed = %str(0); %if %length(&setup) = 0 %then %let setup = %str(setup); %if %length(&npop) = 0 %then %let npop = %str(npop); %if %length(&strata) = 0 %then %let strata =strata; %if %length(&frame) = 0 %then %let frame = %str(frame); %if %length(&sample) = 0 %then %let sample = %str(sample); %if %length(&n) = 0 %then %let n = %str(n); proc sort data = &frame; by &strata; proc sort data = &setup; by &strata; data temp_; merge &frame &setup(keep = &npop &strata &n); by &strata; data &sample(drop = &npop &n); set temp_; by &strata; retain nprime_ 0 pprime_ 1 rprime_ 0 u_ 0; if first.&strata then do; nprime_ = &npop; rprime_ = &npop - &n; u_ = ranuni(&seed); pprime_ = pprime_*rprime_/nprime_; end; if pprime_ > u_ then do; rprime_ = rprime_ - 1; nprime_ = nprime_ - 1; if nprime_ > 0 then pprime_ = pprime_*rprime_/nprime_; end; else do; output; nprime_ = nprime_ - 1; pprime_ = 1; u_ = ranuni(&seed); if nprime_ > 0 then pprime_ = pprime_*rprime_/nprime_; end; drop nprime_ pprime_ rprime_ u_; %if %length(&noprint) = 0 %then %do; proc print data = &sample; title1 "Stratified Random Sample"; title2 "Output Data Set = &sample"; %end; run; title; %mend strs;